home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / general / procssng / ccs / ccs-11tl.lha / lbl / hips / sources / tools / mixadd.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-06-06  |  12.5 KB  |  495 lines

  1. /*    Copyright (c)    1990    Jin, Guojun
  2. %
  3. % mixadd.c - add each frame in a sequence by the corresponding frame of another
  4. %    sequence pixel by pixel. If the file which has higher hirechy consists
  5. %    of less frames, then that last frame is added by each later frames in
  6. %    the input sequence, otherwise corresponding frames are used.    */
  7.  
  8. char    usage[]="{%s}\n\
  9. mixadd filter_file [-base_value [-r]] [-a array] [-f #] [-n #] < image [> output]\n\
  10. @ -#    add this value to each pixel in every frame which is taken from    \n\
  11. @        standard input (ignore any input in command line)    \n\
  12. @ -a array_file    will add some value from array file to corresponding frame.\n\
  13. @        The array file format is:    \n\
  14. @    \n\
  15. @        start_frame(0 -- f-1)    number_frame_be_processed(nfbp)    \n\
  16. @        v1 v2 ... v_nfbp    \n\
  17. @\n\
  18. @        More information, see -f & -n options.    \n\
  19. @\n\
  20. @ -f #    starting frame to process. If -a used after -f, then    \n\
  21. @        start_frame value in array_file will be used. Otherwise,\n\
  22. @        -f # will be used.    \n\
  23. @ -n #    number of frames will be processed. If -a used and nfbp    \n\
  24. @        in array_file is less then -n #, the v_nfbp will be used\n\
  25. @        for later (n - nfbp) frames.    \n\
  26. @    Also, if -a used without -n option, then number of frames    \n\
  27. @        which equal to total frames substrct start_frame    \n\
  28. @        will be processed.    \n\
  29. @\n\
  30. @    The following combinations of image formats are supported:    \n\
  31. @\n\
  32. @        File sequence        Standard input sequence    \n\
  33. @\n\
  34. @        any non pyramid format combinations        \n\
  35. @        integer pyramid        integer pyramid        \n\
  36. @        float pyramid        float pyramid        \n";
  37. /*
  38. % AUTHOR    Guojun Jin - LBL    12/30/90
  39. % last change    3/15/91    -- add array operation.
  40. */
  41.  
  42. #include "header.def"
  43. #include "imagedef.h"
  44.  
  45. U_IMAGE    *img, *img1;
  46.  
  47. #define    ibuf    img1->dest
  48. #define    obuf    img->dest
  49. #define    itemp1    img1->src
  50. #define    in_fp0    img->IN_FP
  51. #define    out_fp0    img->OUT_FP
  52. #define    in_fp1    img1->IN_FP
  53.  
  54. #define    GValue()    arget(argc, argv, &i, &k)
  55. #define    SValue()    avset(argc, argv, &i, &k, 1)
  56.  
  57. MType    fsize, diffsize, addbase=0;
  58. int    ccf=0, cf=0, *array, ap, bgn_frm, nfrm, rotate;
  59.  
  60.  
  61. main (argc,argv)
  62. int    argc;
  63. char**    argv;
  64. {
  65. int    toplev, i;
  66.  
  67. /*    img has higher hirechy than img1    */
  68. img = (U_IMAGE *) zalloc((MType)sizeof(*img), 1L, "img"),
  69. img1 = (U_IMAGE *) zalloc((MType)sizeof(*img1), 1L, "img1");
  70.  
  71. format_init(img, IMAGE_INIT_TYPE, HIPS, -1, *argv, "S16-1");
  72. format_init(img1, IMAGE_INIT_TYPE, HIPS, -1, *argv, "S16-1");
  73.  
  74. for (i=1; i<argc; i++)
  75.     if (*argv[i] == '-'){
  76.     int    k=1;
  77.     switch (argv[i][k++]){
  78.     case 'a':    if (!SValue())    goto    aferr;
  79.     {
  80.         register FILE*    fp_array = fopen(argv[i]+k, "r");
  81.         if (!fp_array)
  82. aferr:            syserr("can't open data array %s", argv[i]);
  83.         fscanf(fp_array, "%d %d", &bgn_frm, &ap);
  84.         array = zalloc((MType)ap, (MType)sizeof(*array));
  85.         for (k=0; k<ap; k++)
  86.             if (fscanf(fp_array, "%d", array+k) < 0)
  87.             syserr("array members are less than %d", ap);
  88.     }
  89.     break;
  90. #ifdef    IBMPC
  91.     case 'i':if (!SValue())    break;
  92.         if ((in_fp0=freopen(argv[i]+k, "rb", stdin)))    break;
  93.         syserr("can't open %s as image input", argv[i]);
  94. #endif
  95.     case 'f':if (SValue())
  96.             bgn_frm = atoi(argv[i]+k) - 1;
  97.         break;
  98.     case 'n':    nfrm = GValue();
  99.         break;
  100.     case 'r':    rotate++;    break;
  101.     case 'o':if (SValue() &&
  102.             (out_fp0=freopen(argv[i]+k, "wb", stdout)))    break;
  103.         syserr("%s can't be opened", argv[i]);
  104.     default:
  105.         if (isfloat(argv[i][1]))
  106.             addbase = atoi(argv[i]+1);
  107.         else
  108. errout:            usage_n_options(usage, i, argv[i]);
  109.     }
  110.     }
  111.     else if ((in_fp1=fopen(argv[i], "rb")) == NULL)
  112.     syserr("can't open frame file -- %s", argv[i]);
  113.  
  114. io_test(fileno(in_fp0), goto    errout);
  115.  
  116. (*img->header_handle)(HEADER_READ, img, 0, 0);
  117. img->o_form = img->in_form;
  118. img->pxl_out = img->pxl_in;
  119.  
  120. if (!addbase && !ap) {
  121.     (*img1->header_handle)(HEADER_FREAD, img1, in_fp1, 0);
  122.     img1->o_form = img1->in_form;
  123.     img1->pxl_out = img1->pxl_in;
  124.     if (img->in_form < img1->in_form){
  125.     register U_IMAGE*    itemp = img;    img = img1;    img1 = itemp;
  126.     }
  127.     diffsize = img->pxl_in - img1->pxl_in;
  128.     if (diffsize)
  129.         if (img->in_form == IFMT_COMPLEX)
  130.             diffsize -= 4;
  131.         else if (img->in_form == IFMT_DBLCOM)
  132.             diffsize -= 12;
  133.     if ((img->in_form==IFMT_FLOAT || img->in_form==IFMT_COMPLEX) &&
  134.         img1->in_form == IFMT_LONG)
  135.         diffsize = 12;
  136.  
  137.     if (img->height != img->height || img->width != img1->width)
  138.         prgmerr(0x73, "frame file and input header mismatch");
  139. }
  140. else{    if (img->in_form > IFMT_LONG)
  141.         prgmerr(0x62, "Base value not used for FLOAT (%d)", addbase);
  142.     img1->frames = 0;
  143. }
  144.  
  145. if (bgn_frm<0)
  146.     bgn_frm = 0;
  147. else if (bgn_frm>img->frames)
  148.     bgn_frm = img->frames-1;
  149. if (nfrm<1)    nfrm = img->frames;
  150. else if (nfrm + bgn_frm > img->frames)
  151.     nfrm = img->frames - bgn_frm;
  152.  
  153. (*img->header_handle)(HEADER_WRITE, img, argc, argv, True);
  154.  
  155. if (img->in_form == IFMT_LONGPYR || img->in_form == IFMT_FLOATPYR)
  156.    if    (img->in_form != img1->in_form)
  157.     prgmerr(0x46, "format not matching");
  158.    else{
  159.     if (upread(&toplev,1,sizeof(toplev),in_fp0) != sizeof(toplev))
  160.         syserr("error reading standard input number of levels");
  161.     if (upread(&i, 1, sizeof(i), in_fp1) != sizeof(i))
  162.         syserr("error reading file input number of levels");
  163.     if (toplev != i)
  164.         syserr("pyramid number of levels mismatch");
  165.     fsize = pyrnumpix(toplev,img->height,img->width);
  166.     if (fwrite(&toplev,1,sizeof(toplev),out_fp0) != sizeof(toplev))
  167.         syserr("error writing number of pyramid levels");
  168.    }
  169. else    fsize = img->height*img->width;
  170.  
  171. if (img->in_form == IFMT_COMPLEX || img->in_form == IFMT_DBLCOM){
  172.     if (img->in_form == img1->in_form)    ccf++;
  173.     cf++;
  174. }
  175.  
  176. if (img1->pxl_in)
  177.     ibuf = zalloc(fsize, img1->pxl_in + (diffsize&7));
  178.  
  179. img->src = obuf = zalloc(fsize, img->pxl_out);
  180. if (diffsize && diffsize < 8)
  181.     itemp1 = zalloc(fsize, img1->pxl_in);
  182. else    itemp1 = ibuf;
  183. img->load_all = 0;
  184. for (i=bgn_frm; i; i--){
  185.     if ((*img->std_swif)(FI_LOAD_FILE, img, 0, No))
  186.         syserr("error during read passing");
  187.     if (fwrite(obuf, img->pxl_out, fsize, out_fp0) != fsize)
  188.         syserr("error during write passing");
  189. }
  190.  
  191. message("passing %d & adding %d frames\n", bgn_frm, nfrm);
  192.  
  193. switch(img->in_form)
  194.     {
  195.     case IFMT_BYTE:
  196.         addb(nfrm,img1->frames);    break;
  197.     case IFMT_SHORT:
  198.         addbs(nfrm,img1->frames);    break;
  199.     case IFMT_LONG:
  200.     case IFMT_LONGPYR:
  201.         addint(nfrm,img1->frames);    break;
  202.     case IFMT_FLOAT:
  203.     case IFMT_COMPLEX:
  204.     case IFMT_FLOATPYR:
  205.         addfloat(nfrm,img1->frames);    break;
  206.     default:
  207.         adddbl(nfrm,img1->frames);
  208.     }
  209. for (i=img->frames - bgn_frm - nfrm; i; i--){
  210.     if ((*img->std_swif)(FI_LOAD_FILE, img, 0, No))
  211.         syserr("error during read passing");
  212.     if (fwrite(obuf, img->pxl_out, fsize, out_fp0) != fsize)
  213.         syserr("error during write passing");
  214. }
  215. exit(0);
  216. }
  217.  
  218. #define    add_base(bound)    { register int    sum;    \
  219.     for(i=fsize; i--;)    {    \
  220.         sum = *obp + addbase;    \
  221.         if (sum>bound)    *obp++ = bound;    \
  222.         else if (sum<0)    *obp++ = 0;    \
  223.         else    *obp++ += addbase;    \
  224.     }    }
  225.  
  226. addb(num_frame,fnum_frame)
  227. {
  228. int    f;
  229. register int    i;
  230. register byte    *obp,*ibp;
  231.  
  232.     for (f=0;f<num_frame;f++) {
  233.         if (fnum_frame) {
  234.         fnum_frame--;
  235.         if ((*img1->std_swif)(FI_LOAD_FILE, img1, 0, No) != fsize)
  236.             syserr("reading error during b1-read");
  237.         }
  238.         if ((*img->std_swif)(FI_LOAD_FILE, img, 0, No) != fsize)
  239.         syserr("reading error during b0_read");
  240.  
  241.     obp = (byte*)obuf;    ibp = (byte*)ibuf;
  242.     if (f < ap)    addbase = array[f];
  243.     if (addbase)
  244.         if (rotate)
  245.             for(i=fsize; i--;)
  246.             *obp++ += addbase;
  247.         else    add_base(255)
  248.     else for(i=0; i<fsize; i++, ibp++)
  249.         if (*obp + *ibp > 255)    *obp++ = 255;
  250.         else    *obp++ += *ibp;
  251.     if (fwrite(obuf, 1, fsize, out_fp0) != fsize)
  252.         syserr("error during write byte");
  253.     }
  254. }
  255.  
  256. addbs(num_frame,fnum_frame)
  257. {
  258. int    f;
  259. register int    i;
  260. register unsigned short    *obp,*ibp;
  261.  
  262.     for (f=0;f<num_frame;f++) {
  263.         if (fnum_frame) {
  264.         fnum_frame--;
  265.         switch (diffsize){
  266.         case 0:    if((*img1->std_swif)(FI_LOAD_FILE, img1, 0, No) != fsize)
  267.                 syserr("reading error during bs1");
  268.             break;
  269.         case 1:    if((*img1->std_swif)(FI_LOAD_FILE, img1, 0, No) != fsize)
  270.                 syserr("reading during bs transfer1");
  271.             btos(itemp1, ibuf, fsize);
  272.             break;
  273.         default:syserr("BS1 to int error %d", diffsize);
  274.         }
  275.         }
  276.         if ((*img->std_swif)(FI_LOAD_FILE, img, NULL, No) != fsize)
  277.         syserr("reading during SRead");
  278.  
  279.         obp = (unsigned short *)obuf;
  280.         ibp = (unsigned short *)ibuf;
  281.         if (f < ap)    addbase = array[f];
  282.         if (addbase)    add_base(65535)
  283.         else    for (i=fsize; i--;)
  284.             *obp++ += *ibp++;
  285.         if (fwrite(obuf, img->pxl_out, fsize, out_fp0) != fsize)
  286.             syserr("during write short");
  287.     }
  288. }
  289.  
  290. addint(num_frame,fnum_frame)
  291. {
  292. register int    i,*obp,*ibp;
  293. int    f;
  294.  
  295.     for (f=0;f<num_frame;f++) {
  296.         if (fnum_frame) {
  297.         fnum_frame--;    /* (sizeof(int)-diffsize%4)    */
  298.         if ((*img1->std_swif)(FI_LOAD_FILE, img1, 0, No) != fsize)
  299.             syserr("reading error during btoi transfer");
  300.         switch(diffsize){
  301.         case 2:    stoi(itemp1, ibuf, fsize);    break;
  302.         case 3: btoi(itemp1, ibuf, fsize);    break;
  303.         default:    syserr("X to int error %d", diffsize);
  304.         }
  305.         }
  306.         if ((*img->std_swif)(FI_LOAD_FILE, img, 0, No) != fsize)
  307.         syserr("during last int sequence read");
  308.         obp = (int*)obuf;
  309.         ibp = (int*)ibuf;
  310.         if (f < ap)    addbase = array[f];
  311.         if (addbase)
  312.         for(i=fsize; i--;)
  313.             *obp++ += addbase;
  314.         else    for (i=fsize; i--;)
  315.             *obp++ += *ibp++;
  316.         if (fwrite(obuf, img->pxl_out, fsize, out_fp0) != fsize)
  317.             syserr("during write int");
  318.     }
  319. }
  320.  
  321. addfloat(num_frame,fnum_frame)
  322. {
  323. int    f;
  324. register int    i;
  325. register float    *obp, *ibp;
  326.     for (f=0;f<num_frame;f++) {
  327.         if (fnum_frame) {
  328.         fnum_frame--;    /* (sizeof(float)-diffsize%4) */
  329.         if ((i=(*img1->std_swif)(FI_LOAD_FILE, img1, 0, No)) != fsize)
  330.             syserr("reading during xtof transfer %d", i);
  331.         else    message("read %d bytes\n", i);
  332.         switch(diffsize){
  333.         case 12:itof(itemp1, ibuf, fsize);    break;
  334.         case 3:    btof(itemp1, ibuf, fsize);    break;
  335.         case 2:    stof(itemp1, ibuf, fsize);    break;
  336.         case 0:    break;
  337.         default:syserr("X to float diff %d", diffsize);
  338.         }
  339.         }
  340.         if ((i=(*img->std_swif)(FI_LOAD_FILE, img, 0, No)) != fsize)
  341.             syserr("during last float sequence read %d", i);
  342.         obp = (float*)obuf;
  343.         ibp = (float*)ibuf;
  344.         for (i=fsize; i--;) {
  345.         *obp++ += *ibp++;
  346.         if (ccf)    *obp++ += *ibp++;
  347.         else if (cf)    *obp++;
  348.         }
  349.         if (fwrite(obuf,img->pxl_out,fsize,out_fp0) != fsize)
  350.             syserr("during write float");
  351.     }
  352. }
  353.  
  354. adddbl(num_frame,fnum_frame)
  355. {
  356. int    f,s2=1<<ccf, s1=1<<cf;
  357. register int    i;
  358. register double    *obp, *ibp;
  359.     for (f=0;f<num_frame;f++) {
  360.         if (fnum_frame) {
  361.         fnum_frame--;
  362.         if (diffsize)
  363.         {
  364.         if((i=upread(itemp1, (sizeof(double)-(diffsize&7)), fsize, in_fp1))
  365.             != fsize)
  366.             syserr("reading during transfer");
  367.         else    message("read %d bytes\n", i);
  368.         switch(diffsize)    {
  369.             case 4:    ftod(itemp1, ibuf, fsize);    break;
  370.             case 12:itod(itemp1, ibuf, fsize);    break;
  371.             case 6:    stod(itemp1, ibuf, fsize);    break;
  372.             case 7:    btod(itemp1, ibuf, fsize);    break;
  373.             default:syserr("X to double error %d", diffsize);
  374.         }
  375.         } else if (upread(ibuf,s2 * sizeof(double),fsize,in_fp1) !=
  376.             fsize)
  377.                 syserr("during read");
  378.         }
  379.         if (upread(obuf, s1 * sizeof(double), fsize, in_fp0) != fsize)
  380.             syserr("during fixed sequence read");
  381.         obp = (double *)obuf;
  382.         ibp = (double *)ibuf;
  383.         for (i=0;i<fsize;i++) {
  384.         *obp++ += *ibp++;
  385.         if (ccf)    *obp++ += *ibp++;
  386.         else if (cf)    *obp++;
  387.         }
  388.         if (fwrite(obuf, s1 * sizeof(double), fsize, out_fp0) != fsize)
  389.             syserr("write double");
  390.     }
  391. }
  392.  
  393. btos(ibp, obp, n)
  394. register byte*    ibp;
  395. register short*    obp;
  396. register int    n;
  397. {
  398. #ifdef    _DEBUG_
  399. message("%d byte to short\n", n);
  400. #endif
  401. while (n--)    *obp++ = *ibp++;
  402. }
  403.  
  404. btoi(ibp, obp, n)
  405. register byte*    ibp;
  406. register int*    obp, n;
  407. {
  408. #ifdef    _DEBUG_
  409. message("%d byte to integer\n", n);
  410. #endif
  411. while (n--)    *obp++ = *ibp++;
  412. }
  413.  
  414. btof(ibp, obp, n)
  415. register byte*    ibp;
  416. register float*    obp;
  417. register int    n;
  418. {
  419. #ifdef    _DEBUG_
  420. message("%d byte to float\n", n);
  421. #endif
  422. while (n--)    *obp++ = (float)*ibp++;
  423. }
  424.  
  425. btod(ibp, obp, n)
  426. register byte*    ibp;
  427. register double    *obp;
  428. register int    n;
  429. {
  430. while (n--)    *obp++ = *ibp++;
  431. }
  432.  
  433. stoi(ibp, obp, n)
  434. register unsigned short    *ibp;
  435. register int    *obp, n;
  436. {
  437. #ifdef    _DEBUG_
  438. message("%d short to integer\n", n);
  439. #endif
  440. while (n--)    *obp++ = *ibp++;
  441. }
  442.  
  443. stof(ibp, obp, n)
  444. register unsigned short    *ibp;
  445. register float*    obp;
  446. register int    n;
  447. {
  448. #ifdef    _DEBUG_
  449. message("%d short to float\n", n);
  450. #endif
  451. while (n--)    *obp++ = (float)*ibp++;
  452. }
  453.  
  454. stod(ibp, obp, n)
  455. register unsigned short    *ibp;
  456. register double    *obp;
  457. register int    n;
  458. {
  459. #ifdef    _DEBUG_
  460. message("%d short to double\n", n);
  461. #endif
  462. while (n--)    *obp++ = *ibp++;
  463. }
  464.  
  465. itof(ibp, obp, n)
  466. register int*    ibp, n;
  467. register float*    obp;
  468. {
  469. #ifdef    _DEBUG_
  470. message("%d itof\n", n);
  471. #endif
  472. while (n--)    *obp++ = *ibp++;
  473. }
  474.  
  475. itod(ibp, obp, n)
  476. register int*    ibp, n;
  477. register double    *obp;
  478. {
  479. #ifdef    _DEBUG_
  480. message("%d itod\n", n);
  481. #endif
  482. while (n--)    *obp++ = *ibp++;
  483. }
  484.  
  485. ftod(ibp, obp, n)
  486. register float*    ibp;
  487. register double    *obp;
  488. register int    n;
  489. {
  490. #ifdef    _DEBUG_
  491. message("%d FtoD\n", n);
  492. #endif
  493. while (n--)    *obp++ = *ibp++;
  494. }
  495.